﻿using System;
using System.Collections.Generic;
using TPDiseño.Clases_de_Entidad;
using DAO.DataSetConsultoraTableAdapters;

namespace DAO
{
    public class DAOCuestionario : DAO
    {
        //Atributos de manejo de instancia (singleton)
        static DAOCuestionario instance = null; 
        // Atributos para acceso a los DataSet Tipados
        private DataSetConsultora.CuestionarioDataTable CuestionarioTabla = new DataSetConsultora.CuestionarioDataTable();
        private CuestionarioTableAdapter CuestionarioTableAdapter = new CuestionarioTableAdapter();
        // Dependencias de otros DAOs
        private DAOEstado miDAOEstado = DAOEstado.Instance;
        private DAOH_Competencia miDAOH_Competencia = DAOH_Competencia.Instance;
        private DAOH_Pregunta miDAOH_Pregunta = DAOH_Pregunta.Instance;
        private DAOCandidato miDAOCandidato = DAOCandidato.Instance;

        public static DAOCuestionario Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new DAOCuestionario();
                        }
                    }
                }
                return instance;
            }
        }
        
        public Cuestionario guardar(Cuestionario unCuestionario, int id_candidato, int id_evaluacion){
            
            // Inserta un cuestionario con sus relaciones candidato y evaluacion, atravez del table adapter
            CuestionarioTableAdapter.Insertar(unCuestionario._bloque, 
                                              unCuestionario._fecha_inicio, 
                                              unCuestionario._fecha_fin, 
                                              unCuestionario._clave, 
                                              id_candidato, 
                                              id_evaluacion
                                              ); 

            // Recolecta los resultados de la insercion
            return recolectarUno();
        }


        public void guardar(Evaluacion unaEvaluacion)
        {

            // Recorro todos lso cuestionarios para guardarlos...
            foreach (Cuestionario unCuestionario in unaEvaluacion._cuestionarios)
            {

                // Inserta un cuestionario con sus relaciones candidato y evaluacion, atravez del table adapter
                CuestionarioTabla = CuestionarioTableAdapter.Insertar(unCuestionario._bloque,
                                                                      unCuestionario._fecha_inicio,
                                                                      unCuestionario._fecha_fin,
                                                                      unCuestionario._clave,
                                                                      unCuestionario._candidato._id,
                                                                      unaEvaluacion._cod_evaluacion
                                                                      );

                // Le seteo el id o codigo del cuestionario insertado
                unCuestionario._cod_cuestionario = recolectarId();

                // Guardo todos comptencia del cuestionario
                miDAOH_Competencia.guardar(unCuestionario);
            }

        }

        public List<Cuestionario> cargar(){

            // Cargo todos los Cuestionario de la db
            CuestionarioTabla = CuestionarioTableAdapter.GetData();

            // Finalmente devuelvo la lista de puestosCargados, recolectadas por la funcion            
            return recolectar();
        }

        public List<Cuestionario> cargar(Evaluacion unaEvaluacion)
        {

            // Cargo todos los Cuestionario de la db relacionados a la evaluacion
            CuestionarioTabla = CuestionarioTableAdapter.ConsultarPorEvaluacion(unaEvaluacion._cod_evaluacion);

            // Finalmente devuelvo la lista de puestosCargados, recolectadas por la funcion            
            return recolectar();
        }

        public void Actualizar(Cuestionario unCuestionario)
        {
            DAOH_Pregunta daoPreg = new DAOH_Pregunta();
            DAOH_Competencia daoComp = new DAOH_Competencia();
            //actualizo el cuestionario
            CuestionarioTableAdapter.ActualizarPorCuestionario(unCuestionario._bloque, unCuestionario._fecha_inicio, unCuestionario._fecha_fin, unCuestionario._timepoTrascurrido, unCuestionario._clave, unCuestionario._cod_cuestionario, unCuestionario._cant_accesos, unCuestionario._ultimo_acceso, unCuestionario._estado._cod_estado);
            foreach (H_pregunta hpreg in unCuestionario._preguntas)
            {
                daoPreg.actualizar(hpreg);
            }
            foreach (H_competencia hcomp in unCuestionario._competencias)
            {
                daoComp.actualizar(hcomp);
            }
            

        }

        
        public List<Cuestionario> cargar(Int32 unCandidato_Id)
        {

            // obtengo la empresa por id en empresaTabla
            CuestionarioTabla = CuestionarioTableAdapter.consultarPorCandidato(unCandidato_Id);

            // Finalmente retorno un nuevo objeto Cuestionario mapeado de la tabla
            return recolectar();
            
        }

        public List<Cuestionario> cargar(List<Candidato> unosCandidatos)
        {
            // Creo una nueva lista de cuestionarios, para ir agreando lso cuestinariso de los distintos candidatos
            List<Cuestionario> cuestionariosDeCandidatos = new List<Cuestionario>();
            
            foreach (Candidato unCandidato in unosCandidatos)
            {
                // reuso la funcion cargar cuestionario por id de candidato
                cargar(unCandidato._id);
                // Voy concatenando los resultados
                cuestionariosDeCandidatos.AddRange(recolectar());
            }
           
            // Finalmente retorno la lista con todos los cuestionarios de los candidatos
            return cuestionariosDeCandidatos;

        }

        private List<Cuestionario> recolectar(){

            // Creo la lista para recolectar y devolver los puestos cargados de la db
            List<Cuestionario> CuestionariosCargados = new List<Cuestionario>();

            // Recorro los puestos de la tabla
            foreach (DataSetConsultora.CuestionarioRow unaCuestionarioFila in CuestionarioTabla)
            {

                // Creo un puesto y lo agrego a la lista de puestos cargados
                CuestionariosCargados.Add(new Cuestionario(unaCuestionarioFila.id,
                                                           unaCuestionarioFila.clave,
                                                           unaCuestionarioFila.bloque,
                                                           unaCuestionarioFila.fecha_inicio,
                                                           unaCuestionarioFila.fecha_fin,
                                                           unaCuestionarioFila.tiempo_acum,
                                                           miDAOEstado.cargar(unaCuestionarioFila.Estado_id),
                                                           miDAOH_Competencia.cargar(unaCuestionarioFila.id),
                                                           miDAOH_Pregunta.cargarPorC(unaCuestionarioFila.id),
                                                           miDAOCandidato.cargar(unaCuestionarioFila.Candidato_id),
                                                           unaCuestionarioFila.cant_accesos,
                                                           unaCuestionarioFila.ultimo_acceso
                                                        )
                                          );

            }

            return CuestionariosCargados;
        }

        public Cuestionario recolectarUno(){
            if (CuestionarioTabla.Count > 0)
            {
                // Finalmente retorno un nuevo objeto cuestionario mapeado de la tabla
                return new Cuestionario(CuestionarioTabla[0].id,
                                    CuestionarioTabla[0].clave,
                                    CuestionarioTabla[0].bloque,
                                    CuestionarioTabla[0].fecha_inicio,
                                    CuestionarioTabla[0].fecha_fin,
                                    CuestionarioTabla[0].tiempo_acum,
                                    miDAOEstado.cargar(CuestionarioTabla[0].Estado_id),
                                    miDAOH_Competencia.cargar(CuestionarioTabla[0].id),
                                    miDAOH_Pregunta.cargar(CuestionarioTabla[0].id),
                                    miDAOCandidato.cargar(CuestionarioTabla[0].Candidato_id),
                                    CuestionarioTabla[0].cant_accesos,
                                    CuestionarioTabla[0].ultimo_acceso
                                    );
            }
            else
            {
                return new Cuestionario();
            }
            
        }

        private int recolectarId()
        {
            if (CuestionarioTabla.Count > 0)
            {
                return CuestionarioTabla[0].id;
            }

            return -1;
        }
        
        
    }
}
